[アップデート]AWS SAM CLIの設定ファイルにyaml形式が利用できるようになりました
初めに
本日AWS SAM CLIのv1.91.0
がリリースされました。
AWS SAM CLIの設定ファイルはsamconfig.toml
となりtoml形式が採用されていましたが、今回のアップデート以降はyamlファイルが利用可能となります。
なお執筆時点でドキュメントには記載がないようで、英語版ドキュメントでもフォーマットの記載はtomlのみとなっております。
設定ファイルの作成
sam init
でまずはプロジェクトを生成します。
対話の際の回答により内容は変動しますが今回の設定の場合は以下のようなsamconfig.toml
が生成されます。
# More information about the configuration file can be found here: # https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html version = 0.1 [default] [default.global.parameters] stack_name = "sam-app-default" [default.build.parameters] cached = true parallel = true [default.validate.parameters] lint = true [default.deploy.parameters] capabilities = "CAPABILITY_IAM" confirm_changeset = true resolve_s3 = true [default.package.parameters] resolve_s3 = true [default.sync.parameters] watch = true [default.local_start_api.parameters] warm_containers = "EAGER" [default.local_start_lambda.parameters] warm_containers = "EAGER"
上記の内容をyamlのフォーマットで書き直す以下のようになります。
version: 0.1 default: global: parameters: stack_name: sam-app-default build: parameters: cached: true parallel: true validate: parameters: lint: true deploy: parameters: capabilities: CAPABILITY_IAM confirm_changeset: true resolve_s3: true package: parameters: resolve_s3: true sync: parameters: watch: true local_start_api: parameters: warm_containers: EAGER local_start_lambda: parameters: warm_containers: EAGER
生成したプロジェクトからsamconfig.toml
を削除し上記の内容を記載したsamconfig.yaml
を設置します。
$ ls sam-app-default README.md __init__.py events hello_world samconfig.yaml template.yaml tests
実行
yamlの設定ファイルを読み込むために別途オプション等は不要です。
toml形式の設定ファイルが存在しない状態でsam deploy
を実行しましたが--guided
がなくとも正常にデプロイができました。
$ sam build --no-cached Building codeuri: /xxxxx/sam-app-default/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided $ sam-app-default % sam deploy Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-xxxxx A different default S3 bucket can be set in samconfig.toml Or by specifying --s3-bucket explicitly. Uploading to xxxxx 606922 / 606922 (100.00%) Deploying with following values =============================== Stack name : sam-app-default Region : ap-northeast-1 Confirm changeset : True Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-xxxxx Capabilities : ["CAPABILITY_IAM"] Parameter overrides : {} Signing Profiles : {} Initiating deployment ===================== Uploading to xxxxx.template 558 / 558 (100.00%) Waiting for changeset to be created.. CloudFormation stack changeset --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Operation LogicalResourceId ResourceType Replacement --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Add HelloWorldFunctionRole AWS::IAM::Role N/A + Add HelloWorldFunction AWS::Lambda::Function N/A --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:xxxxxx:changeSet/samcli-deployxxxx/xxxxx Previewing CloudFormation changeset before deployment ====================================================== Deploy this changeset? [y/N]: y 2023-07-19 11:54:56 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 5.0 seconds) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app-default User Initiated CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction - CREATE_COMPLETE AWS::CloudFormation::Stack sam-app-default - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Successfully created/updated stack - sam-app-default in ap-northeast-1
メッセージにまだsamconfig.toml
が残っていますが同ファイル名のファイルは存在しないのでyamlが読み込まれているはず...です。
guidedによる生成も対応済み
sam init
による生成では設定ファイル名の指定がない関係でyamlでの生成は未対応ですが、sam deploy--guided
での生成は既にyamlをサポートしているようです。
指定方法としてはファイル名のサフィックスを.yaml
にすれば自動的にyamlフォーマットとなります。
# 既存の設定の読み込みの影響を加味し念の為設定を削除してから実行 % rm samconfig.yaml % sam deploy --guided Configuring SAM deploy ====================== Looking for config file [samconfig.toml] : Not found Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: sam-app-default-guided AWS Region [ap-northeast-1]: #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: y #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: Y #Preserves the state of previously provisioned resources when an operation fails Disable rollback [y/N]: N Save arguments to configuration file [Y/n]: Y SAM configuration file [samconfig.toml]: samconfig.yaml SAM configuration environment [default]: ...
以下のファイルが生成されます。
default: deploy: parameters: stack_name: sam-app-default-guided resolve_s3: true s3_prefix: sam-app-default-guided region: ap-northeast-1 profile: default confirm_changeset: true capabilities: CAPABILITY_IAM image_repositories: [] version: 0.1
読み込みはtomlが優先される
デフォルト名として利用可能なsamconfig.toml
とsamconfig.yaml
を両方存在させた状態でstack_name
のパラメータをそれぞれsam-app-default-guided-toml
とsam-app-default-guided-yaml
として指定しsam deploy
を実行してみました。
$ sam deploy More than one samconfig file found; using samconfig.toml. To use another config file, please specify it using the '--config-file' flag. ... Deploying with following values =============================== Stack name : sam-app-default-guided-toml Region : ap-northeast-1 Confirm changeset : True Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-xxxx Capabilities : ["CAPABILITY_IAM"] Parameter overrides : {} Signing Profiles : {}
どうやらこの場合はsamconfig.toml
が優先して読み込まれるようです。
複数samconfigファイルが存在しsamconfig.toml
が読み込まれている旨は記載されていますが、白字の関係で見落としがちなポイントになるかもしれないため注意しましょう。
終わりに
今回のアップデートでSAMの設定ファイルの形式の選択肢が1つ増えました。
個人的にはCloudFormation、DockerのComposeファイル、ansible等設定ファイルを書く際にはyamlフォーマットで記載するような機会が多いので使い慣れ的に非常に嬉しいアップデートです。
またSAMテンプレート自体もYAMLで記載可能なため設定関連のフォーマットを揃えることができるのはSAMだけでみても嬉しい点ではあると思います。
とはいえフォーマット程の違いでプログラミング言語のように大きく学習が必要なものではありませんので、属する環境や慣れに応じて選択いただければと思います。
備考(2023/07/20追記)
本機能とは直接関係はありませんがv1.91.0
にはsam remote invoke
がエラーとなり実行できないバグが含まれるためご注意ください。
当バージョン固有のバグのためv1.92.0
以降にバージョンアップすることで解消します。